//
//  WHZSportsMapViewController.m
//  WHZGuDong
//
//  Created by whz on 16/11/9.
//  Copyright © 2016年 whz. All rights reserved.
//

#import "WHZSportsMapViewController.h"
#import "WHZSportTrackingLine.h"
#import <MAMapKit/MAMapKit.h>
#import <Masonry.h>

@interface WHZSportsMapViewController () <MAMapViewDelegate>

@end

@implementation WHZSportsMapViewController
{
    // 起始位置
    CLLocation *_startLocation;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // MARK: - 设置地图视图
    [self setupMapView];
}

#pragma mark - MAMapViewDelegate代理方法
/**
 位置或者设备方向更新后会调用此函数
 
 @param mapView 地图view
 @param userLocation 用户定位信息(包括位置与设备方向等数据) 是一个固定的对象
 @param updatingLocation 表示是否是location数据更新，YES:location数据更新 NO:heading数据更新
 */
- (void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation {
    
    // MARK: - 判断 ‘位置数据’ 是否有变化 - 不一定是经纬度变化
    if (!updatingLocation) {
        
        return;
    }
    
    // MARK: - 判断运动状态 - 只有 继续 才需要绘制运动轨迹
    if (_sportTracking.sportsState != WHZSportsStateContinue) {
        return;
    }
    
    //大概 1s 更新一次
    //    NSLog(@"%@ - %p", userLocation.location, userLocation.location);
    
    // MARK: - 判断 起始位置是否存在
    if (_startLocation == nil) {
        
        _startLocation = userLocation.location;
        
        // MARK: - 设置大头针、指定坐标位置、添加到地图视图
        // 实例化大头针
        MAPointAnnotation *annotation = [MAPointAnnotation new];
        // 指定坐标位置
        annotation.coordinate = userLocation.location.coordinate;
        // 添加到地图视图
        [mapView addAnnotation:annotation];
    }
    
    // MARK: - 绘制轨迹模型
    [mapView addOverlay:[_sportTracking appendLocation:userLocation.location]];
}

#pragma mark - 单机地图回调，返回经纬度
/**
 单击地图回调，返回经纬度
 
 @param mapView 地图View
 @param coordinate 经纬度
 */
- (void)mapView:(MAMapView *)mapView didSingleTappedAtCoordinate:(CLLocationCoordinate2D)coordinate {
    
    // MARK: - 创建轨迹追踪线条模型
    CLLocation *endLocation = [[CLLocation alloc] initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
    WHZSportTrackingLine *trackingLine = [[WHZSportTrackingLine alloc] initWithStartLocation:_startLocation endLocation:endLocation];
    
    // 向地图添加折现对象 - 调用addOverlay方法会走 -mapView:rendererForOverlay: 代理方法
    [mapView addOverlay:trackingLine.polyline];
}

#pragma mark - 需要实现MAMapViewDelegate的-mapView:rendererForOverlay:方法
- (MAOverlayRenderer *)mapView:(MAMapView *)mapView rendererForOverlay:(id<MAOverlay>)overlay {
    
    // MARK: - 判断 overlay 的类型
    if (![overlay isKindOfClass:[MAPolyline class]]) {
        
        return nil;
    }
    
    // MARK: - 实例化直线渲染器
    WHZSportPolyline *polyline = (WHZSportPolyline *)overlay;
    MAPolylineRenderer *renderer = [[MAPolylineRenderer alloc] initWithPolyline:polyline];
    
    renderer.lineWidth = 5;
    renderer.strokeColor = polyline.color;
    
    return renderer;
}

- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id<MAAnnotation>)annotation {
    
    // MARK: - 判断大头针的类型
    if (![annotation isKindOfClass:[MAPointAnnotation class]]) {
        
        return nil;
    }
    
    // MARK: - 查询可重用大头针视图
    static NSString *annotationId = @"annotationId";
    MAAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:annotationId];
    
    // MARK: - 如果没有查到，新建视图
    if (annotationView == nil) {
        
        annotationView = [[MAAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotationId];
    }
    
    // MARK: - 设置大头针 - 设置图像 - 根据运动类型来创建运动图像
    UIImage *image = _sportTracking.sportImage;
    annotationView.image = image;
    annotationView.centerOffset = CGPointMake(0, -image.size.height * 0.5);
    
    return annotationView;
}


#pragma mark - 设置地图视图
/**
 设置地图视图
 */
- (void)setupMapView {
    
    MAMapView *mapView = [[MAMapView alloc] initWithFrame:self.view.bounds];
    
    [self.view addSubview:mapView];
    
    // MARK: - 隐藏比例尺
    mapView.showsScale = NO;
    // MARK: - 关闭相机旋转 - 能够降低能耗，省电
    mapView.rotateCameraEnabled = NO;
    // MARK: - 显示用户位置
    mapView.showsUserLocation = YES;
    // MARK: - 跟踪用户位置 - 可以将用户定位在地图的中心，并且放大地图，有时候速度会有些慢
    mapView.userTrackingMode = MAUserTrackingModeFollow;
    // MARK: - 允许后台定位 - 保证 Background Modes 中的 Location updates 处于选中状态
    mapView.pausesLocationUpdatesAutomatically = NO;
    
    // MARK: - 设置代理
    mapView.delegate = self;
}

@end
